﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MathLibDelegate
{
	public static class Lib
	{

		// Func-делегат с лямбдой возведения X в степень Y
		public static Func<int, int, int> pow = (x, y) =>
		{
			int res = x;
			for (int i = 1; i < y; i++)
			{
				res *= x;
			}
			return res;
		};

		// Func-делегат с лямбдой определения чётности числа
		public static Func<int, bool> Parity = (x) =>
		{
			return ((x & 1) == 0);
		};

		// Func-делегат с лямбдой определения простого числа
		public static Func<int, bool> IsPrime = (x) =>
		{
			// Если число чётное
			if (Lib.Parity(x) == true)
			{
				// число 2 - исключение (оно чётное)
				if (x == 2)
				{
					return true;
				}
				return false;
			}
			int max = (int)Math.Sqrt(x);
			for (int i = 3; i <= max; i += 2)
			{
				if ((x % i) == 0)
				{
					return false;
				}
			}
			return true;
		};

		// Func-делегат с лямбдой определение двоичного веса числа (сколько 1 содержится в двоичном представлении числа)
		public static Func<int, int> BinaryWeight = (x) =>
		{
			int result = 0;
			while (x != 0)
			{
				if (Lib.Parity(x) == false)
					result++;
				x = x / 2;
			}
			return result;
		};

	}
}
